//
//  EntBoostClient.h
//  ENTBoostKit
//
//  Created by zhong zf on 13-11-17.
//
//

#import "SOTP_defines.h"
#import "LogonCenter.h"
#import "UserManager.h"
#import "ChatManager.h"
#import "EBCache.h"

@class EBMsgInfo;
@class EBMessage;
@class EBTalk;
@class EBCallInfo;
@class EBVCard;
@class EBGroupInfo;
@class EBMemberInfo;
@class TBTalk;
@class TBCall;
@class TBMessage;
@class TBChatDot;
@class EBChat;
@class TBLogonProperty;
@class TBCacheVersion;
@class TBGroupInfo;
@class TBMemberInfo;

@protocol ENTBoostClientOuterDelegate
@optional

/**接收到会话邀请
 * @param callInfo 会话信息
 * @param fromUid 发起邀请的用户编号
 * @param fromAccount 发起邀请的用户账号
 * @param vCard 电子名片
 * @param clientAddress 发起方用户客户端登录地址信息
 */
- (void)onCallIncoming:(const EBCallInfo*)callInfo fromUid:(uint64_t)fromUid fromAccount:(NSString*)fromAccount vCard:(EBVCard*)vCard clientAddress:(NSString*)clientAddress;

/**正在进行会话邀请
 * @param callInfo 会话信息
 * @param toUid 被邀请方
 */
- (void)onCallAlerting:(const EBCallInfo*)callInfo toUid:(uint64_t)toUid;

/**会话已经接通
 * @param callInfo 会话信息
 */
- (void)onCallConnected:(const EBCallInfo*)callInfo;

/**被邀请方拒绝通话
 * @param callInfo 会话信息
 */
- (void)onCallReject:(const EBCallInfo*)callInfo;

/**被邀请方忙，未应答
 * @param callInfo 会话信息
 */
- (void)onCallBusy:(const EBCallInfo*)callInfo;

/**断开会话
 * @param callInfo 会话信息
 */
- (void)onCallHangup:(const EBCallInfo*)callInfo;

///**会话的节目是否已关闭，上层应用应重载并告知内层
// * @param callId 会话编号
// * @param isClosed 界面是否已关闭(输出参数)
// */
//- (void)isChatViewClosedForCall:(uint64_t)callId isClosed:(BOOL*)isClosed;

/**即将开始接收文件
 * @param callId 会话编号
 * @param msgId 消息编号
 * @param msgTime 消息发送时间
 * @param fromUid 文件发送方的用户编号
 * @param fileName 文件名
 * @param fileSize 文件大小(字节s)
 * @param accept 是否接收文件(输出参数),TRUE=接收，FALSE=拒绝
 * @param savedFilePath 如确认接收文件，应返回将要保存文件的全路径
 */
- (void)onWillRecevieFileForCall:(uint64_t)callId msgId:(uint64_t)msgId msgTime:(NSDate*)msgTime fromUid:(uint64_t)fromUid fileName:(NSString *)fileName fileSize:(uint64_t)fileSize accept:(BOOL *)accept savedFilePath:(NSString**)savedFilePath;

@end

#pragma mark - ENTBoostClientInnerDelegate
@protocol ENTBoostClientInnerDelegate
@optional

/**
 * @param accountInfo 账号相关信息
 */
- (void)onOauthSuccess:(EBAccountInfo*) accountInfo;

///**提醒需要重登事件
// * @param appName 应用名
// * @param cid 调用标识
// * @param fromServerAddress 来源服务地址
// */
//- (void)needRelogon:(NSString *)appName cid:(uint32_t)cid fromServerAddress:(NSString *)fromServerAddress;

/**接收到聊天消息
 * @param msgInfo 原始的消息实例
 * @param message 包装后消息实例
 * @param callId 会话编号
 */
- (void)onRecevieMsg:(EBMsgInfo*)msgInfo message:(EBMessage*)message callId:(uint64_t)callId;

@end


#pragma mark - ENTBoostClient
///恩布业务基本接口类
@interface ENTBoostClient : NSObject <AbstractManagerDelegate>
{
    //应用编号
    NSString* _appId;
    ///应用密钥
    NSString* _appKey;
    ///应用动态令牌
    NSString* _appOnlineKey;
    
    //    __weak id _delegate; //回调代理
    LogonCenter *_lc;
    
    //    enum UserStatus _userStatus; //用户登录状态(非在线状态)
    //    enum EB_USER_LINE_STATE _lineState; //在线状态
    EBServerInfo *_appServerInfo; //应用中心服务信息
    EBServerInfo *_umServerInfo; //当前用户主UM服务信息
    NSString* _umOnlineKey; //主UM访问令牌
    NSString* _acmKey; //账号验证动态令牌，用于网络掉线、电脑休眠后重新登录时暂替代密码用途;时效短，用户offline后失效
    
//    //需要加密后存入磁盘，以后再实现
//    NSMutableDictionary* _oauthKeys; //自动登录验证令牌，客户端主动创建，可长时间有效
    
    //终端识别码
    NSString* _usId; //待定
    
    //全局并发队列
    dispatch_queue_t _globalDispatchQueue;
    
    //UM服务连接池
    NSMutableDictionary* _umPool;
    //userManager连接池的单线程操作队列
    dispatch_queue_t _umPoolOperationQueue;
    //userManager连接池操作队列关联的自定义数据key
    void *_isOnUMPoolQueueOrTargetQueueKey;
    
//    //定期清理过期数据开关
//    BOOL _isClearingUMPool;
    
    //CM服务连接池
    NSMutableDictionary* _cmPool;
    //chatManager连接池的单线程操作队列
    dispatch_queue_t _cmPoolOperationQueue;
    //chatManager连接池操作队列关联的自定义数据key
    void *_isOnCMPoolQueueOrTargetQueueKey;
    
//    //成员信息缓存；注意该缓存不包括全部成员，只是用于加载多少缓存多少
//    //{key=depCode, value=NSArray}, NSArray中的实例是EBMemberInfo类
//    NSMutableDictionary* _memberInfoCache;
//    //_memberInfoCache的单线程操作队列
//    dispatch_queue_t _memberInfoCacheOperationQueue;
//    //_memberInfoCache连接池操作队列关联的自定义数据key
//    void *_isOnMemberInfoCacheQueueOrTargetQueueKey;
    
    //本地保存数据操作队列
    dispatch_queue_t _persistenceOperationQueue;
    void* _isOnPersistenceQueueOrTargetQueueKey;
    
    //企业信息
    EBEnterpriseInfo* _enterpriseInfo;
}

@property(atomic) BOOL isLogin; //目前是否已登录状态

///当前用户信息
@property(strong, nonatomic) EBAccountInfo* accountInfo;

//当前用户所属企业编号
@property(atomic) uint64_t myEntCode;
////企业部门资料版本号
//@property(atomic) uint64_t entDepInfoVersion;
////个人群组资料版本号
//@property(atomic) uint64_t personalGroupInfoVersion;

///回调代理
@property(weak, nonatomic) id delegate;

/**设置LC服务地址
 * @param lcAddress
 */
+ (void)setLcAddress:(NSString*)lcAddress;

//获取LC服务地址
+ (NSString*)lcAddress;

///获取全局单例
+ (ENTBoostClient*)sharedClient;

//关闭
- (void)close;

///表情资源
@property(strong, nonatomic) NSArray* expressions;
///头像资源
@property(strong, nonatomic) NSArray* headPhotos;
///头像和表情资源是否加载完毕
@property(nonatomic) BOOL isEmotionLoaded;

///资源(表情、头像等)描述信息
@property(strong, nonatomic) NSDictionary* resourceDescriptions;


///联系人信息
@property(strong, nonatomic) NSDictionary* contactInfos;
///联系人信息是否加载完毕
@property(nonatomic) BOOL isContactInfoLoaded;



///CoreData相关
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

//关闭数据库
- (void)closeDataBase;

//数据库保存变更
- (void)saveDataBaseContext;

@end

#pragma mark - LogonCenterExt
///恩布业务登录中心(LC)接口类
@interface ENTBoostClient(LogonCenterExt) <LogonCenterDelegate>

/**初始化应用参数
 * @param appId 应用ID
 * @param appKey 应用key(密钥)
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)initENVWithAppId:(NSString *)appId appKey:(NSString *)appKey success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

/**匿名登录
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)logonVisitor:(void (^)(EBAccountInfo* accountInfo))successBlock failure:(void(^)(NSError* error))failureBlock;

/**登录验证
 * @param account 用户账号
 * @param password 用户密码
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)logonWithAccount:(NSString*)account password:(NSString *)password success:(void (^)(EBAccountInfo* accountInfo))successBlock failure:(void(^)(NSError* error))failureBlock;

/**第三方登录验证
 * @param account 用户账号
 * @param success 验证成功后的回调函数
 * @param forward 验证不通过后的回调函数，返回第三方验证的URL
 * @param failure 调用失败后的回调函数
 */
- (void)oauthWithAccount:(NSString*)account success:(void (^)(EBAccountInfo* accountInfo))successBlock forward:(void(^)(NSString *oauthUrl))forwardBlock failure:(void(^)(NSError* error))failureBlock;

/**重新登录(用于掉线或休眠恢复后)
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)reLogon:(void (^)(EBAccountInfo* accountInfo))successBlock failure:(void(^)(NSError* error))failureBlock;

/**自动登录(曾经在当前客户端成功登录过，自动登录都有可能成功)；游客模式无效
 * @param account 用户账号
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)autoLogonWithAccount:(NSString*)account success:(void (^)(EBAccountInfo* accountInfo))successBlock failure:(void(^)(NSError* error))failureBlock;


/**查询普通用户在线信息，用于实现用户呼叫
 * @param account 对方账号或用户编号(uid)
 * @param callKey 呼叫来源Key，实现企业呼叫来源限制
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)queryUser:(NSString*)account callKey:(NSString*)callKey success:(void(^)(uint64_t uid, NSString* account, uint64_t memberCode, uint64_t depCode, NSString* umKey, enum EB_STATE_CODE userState, EBServerInfo* umServerInfo))successBlock failure:(void(^)(NSError* error))failureBlock;

///**查询部门(可跨部门)或同群组中成员的在线信息，用于实现用户呼叫
// * @param memberCode 成员编号(部门成员或群组成员)
// * @param callKey 呼叫来源Key，实现企业呼叫来源限制
// * @param success 成功后的回调函数
// * @param failure 失败后的回调函数
// */
//- (void)queryMember:(uint64_t)memberCode callKey:(NSString*)callKey success:(void(^)(uint64_t uid, NSString* account, uint64_t memberCode, uint64_t depCode, NSString* umKey, enum EB_STATE_CODE userState, EBServerInfo* umServerInfo))successBlock failure:(void(^)(NSError* error))failureBlock;

/**查询部门(可跨部门)或群组的在线信息，用于实现用户呼叫
 * @param depCode 部门或群组编号
 * @param callKey 呼叫来源Key，实现企业呼叫来源限制
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)queryGroup:(uint64_t)depCode callKey:(NSString*)callKey success:(void(^)(uint64_t uid, NSString* account, uint64_t memberCode, uint64_t depCode, NSString* umKey, enum EB_STATE_CODE userState, EBServerInfo* umServerInfo))successBlock failure:(void(^)(NSError* error))failureBlock;

@end


#pragma mark - UserManagerExt
///恩布业务用户管理(UM)接口类
@interface ENTBoostClient (UserManagerExt) <UserManagerDelegate>

/////企业信息
//@property(strong, nonatomic, readonly) EBEnterpriseInfo* enterpriseInfo;
/////部门信息
//@property(strong, nonatomic, readonly) NSDictionary* entGroupInfos;
/////个人群组信息
//@property(strong, nonatomic, readonly) NSDictionary* personalGroupInfos;
/////成员信息
//@property(strong, nonatomic) NSDictionary* memberInfos;

////启动清理闲置UM连接任务定时器
//- (void)startClearIdleUserManagerTask;
////关闭清理闲置UM连接任务定时器
//- (void)stopClearIdleUserManagerTask;

/**获取UM连接
 * @param address 连接地址，如192.168.0.1:18012
 */
//- (UserManager*)userManagerWithAddress:(NSString*)address;

/**上线并设置在线状态
 * @param state 在线状态
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)onlineWithState:(enum EB_USER_LINE_STATE)state success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

/**下线
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)offlineWithSuccess:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

///**加载资源
// * @param entSuccessBlock 组织架构加载完成后的回调函数
// * @param emotionSuccessBlock 表情资源加载完成后的回调函数
// * @param failure 失败后的回调函数
// */
//- (void)loadResourceInfoWithSuccess:(void(^)(EBEnterpriseInfo* enterpriseInfo, NSDictionary* entGroupInfos, NSDictionary* personalGroupInfos/*, NSDictionary* memberInfos*/))entSuccessBlock emotionSucess:(void(^)(NSArray* expressions, NSArray* headPhotos))emotionSuccessBlock failure:(void(^)(NSError* error))failureBlock;

/**加载企业自身信息
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)cacheLoadEnterpriseInfoWithSuccess:(void(^)(EBEnterpriseInfo* enterpriseInfo))successBlock failure:(void(^)(NSError* error))failureBlock;

/**加载部门信息(不包括成员)
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)cacheLoadEntGroupInfosWithSuccess:(void(^)(NSDictionary* groupInfos))successBlock failure:(void(^)(NSError* error))failureBlock;

/**加载个人群组信息(不包括成员)
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)cacheLoadPersonalGroupInfosWithSuccess:(void(^)(NSDictionary* groupInfos))successBlock failure:(void(^)(NSError* error))failureBlock;

/**加载某部门或群组下成员信息
 * @param depCode 部门或群组编号
 * @param successBlock 加载完成后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)cacheLoadMemberInfosWithDepCode:(uint64_t)depCode success:(void(^)(NSArray* memberInfos))successBlock failure:(void(^)(NSError* error))failureBlock;

/**加载表情和头像资源
 * @param successBlock 加载完成后的回调函数
 * @param failureBlock 失败后的回调函数
 */
- (void)cacheLoadEmotionsWithSuccess:(void(^)(NSArray* expressions, NSArray* headPhotos))successBlock failure:(void(^)(NSError* error))failureBlock;

/**获取一个指定部门或群组信息
 * @param depCode 部门或群组编号
 */
- (EBGroupInfo*)groupInfoWithDepCode:(uint64_t)depCode;

/**加载离线信息
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)loadOfflineInfoWithSuccess:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

/**加载联系人信息
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)loadContactInfoWithSuccess:(void(^)(NSDictionary* contactInfos))successBlock failure:(void(^)(NSError* error))failureBlock;

/**编辑联系人信息
 * @param contactInfo 联系人信息
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)editContactInfo:(EBContactInfo*)contactInfo success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

/**删除联系人信息
 * @param contact 联系人账号
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)delContactInfo:(NSString*)contact success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

- (void)callUser:(uint64_t)toUid toAccount:(NSString*)toAccount existCallId:(uint64_t)existCallId usingAddress:(NSString*)umAddress umKey:(NSString*)umKey success:(void(^)(uint64_t callId, enum EB_ACCOUNT_TYPE fType, BOOL autoAccept))successBlock failure:(void(^)(NSError* error))failureBlock;

///**发起呼叫请求(同企业内部成员或同群组成员)
// * @param memberCode 被邀请成员代码(部门或群组成员)
// * @param existCallId 已存在的会话编号
// * @param umAddress 被邀请用户所在UM连接地址信息
// * @param umKey 进入会话密钥
// * @param success 成功后的回调函数
// * @param failure 失败后的回调函数
// */
//- (void)callMember:(uint64_t)memberCode existCallId:(uint64_t)existCallId usingAddress:(NSString*)umAddress umKey:(NSString*)umKey success:(void(^)(uint64_t callId, enum EB_ACCOUNT_TYPE fType))successBlock failure:(void(^)(NSError* error))failureBlock;

/**发起呼叫请求(部门或群组会话)
 * @param depCode 部门或群组编号
 * @param existCallId 已存在的会话编号
 * @param toUid 指定某一个成员,0=不指定
 * @param umAddress 被邀请用户所在UM连接地址信息
 * @param umKey 进入会话密钥
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)callGroup:(uint64_t)depCode existCallId:(uint64_t)existCallId toUid:(uint64_t)toUid usingAddress:(NSString*)umAddress umKey:(NSString*)umKey success:(void(^)(uint64_t callId, enum EB_ACCOUNT_TYPE fType, BOOL autoAccept))successBlock failure:(void(^)(NSError* error))failureBlock;
/**响应呼叫请求
 * @param callId 会话编号
 * @param accept 是否接受: 1=接受,2=拒绝
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)ackTheCall:(uint64_t)callId accept:(BOOL)accept success:(void(^)(EBServerInfo *umServerInfo, NSString *umKey))successBlock failure:(void(^)(NSError* error))failureBlock;

/**进入会话状况
 * @param callId 会话编号
 * @param depCode 部门或群组编号
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)enterTheCall:(uint64_t)callId depCode:(uint64_t)depCode success:(void(^)(EBServerInfo* cmServerInfo, NSString* cmKey, uint64_t chatId))successBlock failure:(void(^)(NSError* error))failureBlock;

/**退出会话
 * @param callId 会话编号
 * @param hangup 部门或群组编号
 * @param success 成功后的回调函数
 * @param failure 失败后的回调函数
 */
- (void)hangupTheCall:(uint64_t)callId hangup:(BOOL)hangup success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

///获取所有会话信息
- (NSDictionary*)callInfos;

///获取会话信息
- (EBCallInfo*)callInfoWithCallId:(uint64_t)callId;

/**获取会话信息
 * @param uid 用户编号, 0=不作为查询条件
 * @param account 用户账号, nil=不作为查询条件
 * @param depCode 群组编号, 0=寻找一对一会话, 大于0寻找群组会话
 */
- (EBCallInfo*)callInfoWithUid:(uint64_t)uid Account:(NSString*)account depCode:(uint64_t)depCode;

//清空所有会话信息
- (void)removeAllCallInfo;

/**删除会话信息
 * @param 会话编号
 */
- (void)removeCallInfoWithCallId:(uint64_t)callId;

/**呼叫流程
 * @param depCode 群组编号
 * @param toUid 被邀请方用户编号，群组会话中可不填(0)
 * @param existCallId 已存在的会话编号
 * @param callKey 呼叫来源Key,用于实现企业呼叫来源限制
 * @param failure 失败后的回调函数
 */
- (void)callFlowWithDepCode:(uint64_t)depCode toUid:(uint64_t)toUid existCallId:(uint64_t)existCallId callKey:(NSString*)callKey onFailure:(void(^)(NSError *error))failureBlock;;

@end


#pragma mark - ChatManagerExt
///恩布业务聊天管理(CM)接口类
@interface ENTBoostClient (ChatManagerExt) <ChatManagerDelegate>

/**删除CM连接
 * @param address 连接地址，如192.168.0.1:18012
 */
- (void)removeChatManagerInCMPoolWithAddress:(NSString*)address;

/**进入聊天会话
 * @param callId 会话编号
 * @param chatId 聊天编号
 * @param chatKey 聊天会话KEY
 * @param offUid 被邀请方用户编号(离线时才需要使用)
 * @param depCode 部门或群组代码
 * @param cmAddress CM连接地址信息
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)cmEnterWithCallId:(uint64_t)callId chatId:(uint64_t)chatId chatKey:(NSString*)chatKey offUid:(uint64_t)offUid depCode:(uint64_t)depCode usingAddress:(NSString*)cmAddress success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

/**退出聊天会话
 * @param chatId 聊天编号
 * @param chatKey 聊天会话KEY
 * @param exitSession 是否退出会话, TRUE=退出会话，用于挂断一对一会话,FALSE=离线状况(非挂断会话)
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)cmExitWithChatId:(uint64_t)chatId chatKey:(NSString*)chatKey exitSession:(BOOL)exitSession success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

/**发送富文本信息
 * @param richEntities EBRichEntity实例数组
 * @param richSubType 富文本信息子类型(EB_RICH_SUB_TYPE_JPG =图片模式,EB_RICH_SUB_TYPE_AUDIO=语音模式),图片和语音不可以同一条聊天信息中混发
 * @param callId 会话编号
 * @param toUid 接收方用户编号(如发送至群中所有人时，填0)
 * @param isPrivate 是否私聊(用于群组聊天时)
 * @param begin 开始发送回调函数
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)sendRichInfo:(NSArray*)richEntities richSubType:(EB_RICH_SUB_TYPE)richSubType forCallId:(uint64_t)callId toUid:(uint64_t)toUid isPrivate:(BOOL)isPrivate begin:(void(^)(uint64_t msgId))beginBlock success:(void(^)(uint64_t msgId))successBlock failure:(void(^)(NSError* error))failureBlock;

/**发送文件
 * @param path 文件路径
 * @param callId 会话编号
 * @param toUid 接收方用户编号(如发送至群中所有人时，填0)
 * @param isPrivate 是否私聊(用于群组聊天时)
 * @param offFile 是否传离线文件
 * @param begin 开始发送回调函数
 * @param processing 处理中回调函数
 * @param success 成功后回调函数
 * @param cancel 取消发送文件
 * @param failure 失败后回调函数
 */
- (void)sendFileAtPath:(NSString*)path forCallId:(uint64_t)callId toUid:(uint64_t)toUid isPrivate:(BOOL)isPrivate offFile:(BOOL)offFile begin:(void(^)(uint64_t msgId))beginBlock processing:(EB_PROCESSING_BLOCK)processingBlock success:(void(^)(void))successBlock cancel:(void(^)(BOOL initiative))cancelBlock failure:(void(^)(NSError* error))failureBlock;

/**取消发送文件
 * @param msgId 消息编号
 * @param callId 会话编号
 * @param success 成功后回调函数
 * @param failure 失败后回调函数
 */
- (void)cancelSendingFileWithMsgId:(uint64_t)msgId forCallId:(uint64_t)callId success:(void(^)(void))successBlock failure:(void(^)(NSError* error))failureBlock;

///接收表情资源(内部使用)
- (void)receiveEmotions:(NSDictionary*)emotions cid:(uint32_t)cid onBegin:(void(^)(NSArray* expressions, NSArray* headPhotos))beginBlock onCompletion:(void(^)(NSArray* expressions, NSArray* headPhotos))comletionBlock;

@end


#pragma mark - PersistenceExt
///数据本地保存功能
@interface ENTBoostClient (PersistenceExt)

//获取属于当前用户的所有对话归类
- (NSArray*)tbTalks;

/**查询获取对话归类
 * @param talkId 对话归类编号
 */
- (TBTalk*)tbTalkWithTalkId:(NSString*)talkId;

/**查询获取对话归类，depCode、otherUid和otherAccount不可同时等于0或nil
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param otherAccount 对方用户账号(用于一对一会话)
 */
- (TBTalk*)tbTalkWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid otherAccount:(NSString*)otherAccount;

/**删除对话归类
 * @param talkId 对话归类编号
 */
- (void)deleteTBTalkWithTalkId:(NSString*)talkId;

/**更新对话归类时间字段
 * @param updatedTime 时间
 * @param talkId 对话归类编号
 */
- (void)updateTBTalkWithUpdatedTime:(NSDate*)updatedTime forTalkId:(NSString*)talkId;

/**新增或更新对话归类，depCode与otherUid不可同时等于0
 * @param callInfo 会话实例
 */
- (void)saveOrUpdateTBTalkWithCallInfo:(EBCallInfo*)callInfo;

/**新增或更新对话归类，depCode、otherUid和otherAccount不可同时等于0或nil
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param otherAccount 对方用户账号(用于一对一会话)
 * @param otherUserName 对话用户名(用于一对一会话)
 * @param successBlock 成功时调用的block
 * @param failureBlock 失败时调用的block
 */
- (void)insertOrUpdateTBTalkWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid otherAccount:(NSString*)otherAccount otherUserName:(NSString*)otherUserName success:(void(^)(TBTalk* tbTalk))successBlock failure:(void(^)(NSError* error))failureBlock;


#pragma mark - TBCall
///查询获取会话信息
- (TBCall*)tbCallWithCallId:(uint64_t)callId;
///新增或更新会话信息
- (void)saveOrUpdateTBCall:(const EBCallInfo*)callInfo;
///删除会话信息
- (void)deleteTBCallWithCallId:(uint64_t)callId;


#pragma mark - TBMessage
/**查询获取符合条件的聊天记录数量
 * @param talkId 对话归类编号
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 * @return 聊天记录数量
 */
- (NSUInteger)countOfTBMessagesWithTBTalkId:(NSString*)talkId andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime;

/**查询获取符合条件的聊天记录数量
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 * @return 聊天记录数量
 */
- (NSUInteger)countOfTBMessagesWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime;

/**查询获取符合条件的聊天记录
 * (TBMessage内部结构)
 * @param talkId 对话归类编号
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 * @param perPageSize 每页数量
 * @param currentPage 当前页(从1开始算)
 * @param orderByTimeAscending 是否按聊天记录发生时间升序进行排序
 * @return TBMessage实例数组
 */
- (NSArray*)tbMessagesWithTBTalkId:(NSString*)talkId andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime perPageSize:(NSUInteger)perPageSize currentPage:(NSUInteger)currentPage orderByTimeAscending:(BOOL)orderByTimeAscending;

/**查询获取符合条件的聊天记录
 * (TBMessage内部结构)
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 * @param perPageSize 每页数量
 * @param currentPage 当前页(从1开始算)
 * @param orderByTimeAscending 是否按聊天记录发生时间升序进行排序
 * @return TBMessage实例数组
 */
- (NSArray*)tbMessagesWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime perPageSize:(NSUInteger)perPageSize currentPage:(NSUInteger)currentPage orderByTimeAscending:(BOOL)orderByTimeAscending;

/**查询获取符合条件的聊天记录(TBMessage内部结构)
 * @param messageId 消息编号，用于定位记录位置
 * @param orderByTimeAscending 是否按聊天记录发生时间升序进行排序；NO=降序排序(回头查询)，YES=升序排序
 * @param perPageSize 结果集最大返回数量
 * @return TBMessage实例数组
 */
- (NSArray*)tbMessagesFromLastMessageId:(uint64_t)messageId orderByTimeAscending:(BOOL)orderByTimeAscending perPageSize:(NSUInteger)perPageSize;

/**查询获取多个聊天记录
 * @param messageIds 消息编号数字, NSNumber实例
 * @return TBMessage实例数组
 */
- (NSArray*)tbMessagesWithMessageIds:(NSArray*)messageIds;

///查询获取单个聊天记录
- (TBMessage*)tbMessageWithMessageId:(uint64_t)messageId;

/**新增或更新聊天记录
 * @param msgId 信息编号
 * @param callId 会话编号
 * @param fromUid 信息发起人
 * @param msgTime 信息发起时间
 * @param chats 富文本信息内容
 * @param filePath 文件保存路径(发送/接收文件)
 * @param byteSize 信息内容大小(字节数)
 * @param isPrivate 是否私聊
 * @param isSent 是否已经发送成功
 * @param isReaded 是否已读状态
 * @param offChat 是否离线信息
 * @param msgType 消息类型
 * @param richSubType 富文本消息类型
 */
- (void)saveOrUpdateTBMessage:(uint64_t)msgId callId:(uint64_t)callId fromUid:(uint64_t)fromUid msgTime:(NSDate*)msgTime chats:(NSArray*)chats filePath:(NSString*)filePath byteSize:(uint64_t)byteSize isPrivate:(BOOL)isPrivate isSent:(BOOL)isSent isReaded:(BOOL)isReaded offChat:(BOOL)offChat msgType:(enum EB_MSG_TYPE)msgType richSubType:(enum EB_RICH_SUB_TYPE)richSubType;

///删除单个聊天记录
- (void)deleteTBMessageWithMessageId:(uint64_t)messageId;

/*删除多个聊天记录
 * @param messageIds 消息编号数组
 */
- (void)deleteTBMessagesWithMessageIds:(NSArray*)messageIds;

/**删除多个聊天记录
 * @param talkId 对话归类编号
 */
- (void)deleteTBMessagesWithTalkId:(NSString*)talkId;

#pragma mark - TBChatDot
/**查询获取某个聊天记录中的分块(单个)
 * @param messageId 消息编号
 * @param seq 分块顺序号
 */
- (TBChatDot*)tbChatDotWithMessageId:(uint64_t)messageId sequence:(short)seq;
///查询获取某个聊天记录中的分块(多个)
- (NSArray*)tbChatDotsWithMessageId:(uint64_t)messageId;

///删除某个聊天记录中的全部分块
- (void)deleteTBChatDotsWithMessageId:(uint64_t)messageId;

/**新增或更新聊天记录中的分块
 * @param msgId 信息编号
 * @param seq 分块顺序号
 * @param ebChat 分块内容
 */
- (void)saveOrUpdateTBChatDotWithMsgId:(uint64_t)msgId sequence:(short)seq ebChat:(EBChat*)ebChat;

///查询未读聊天记录的数量(与talkId无关)
- (NSUInteger)countOfUnreadTBMessages;

/**查询未读聊天记录的数量
 * @param talkId 对话归类编号
 */
- (NSUInteger)countOfUnreadTBMessagesWithTBTalkId:(NSString*)talkId;

/**标记单个聊天记录已读状态
 * @param messageId 消息编号
 */
- (void)markTBMessageAsReadedWithMessageId:(uint64_t)messageId;

/**标记多个聊天记录为已读状态
 * @param talkId 对话归类编号
 */
- (void)markTBMessagesAsReadedWithTBTalkId:(NSString*)talkId;

#pragma mark - TBLogonProperty
/**查询获取一个登录信息
 * @param identification 身份识别(账号、UID等)
 */
- (TBLogonProperty*)tbLogonPropertyWithIdentification:(NSString*)identification;

/**新增或更新登录信息
 * @param identification 身份识别(账号、UID等)
 * @param oauthKey 自动登录验证令牌，客户端主动创建，可长时间有效
 * @return TBLogonProperty实例
 */
- (TBLogonProperty*)insertOrUpdateTBLogonPropertyWithIdentification:(NSString*)identification oauthKey:(NSString*)oauthKey;

/**获取登录信息中的自动登录验证令牌
 * @param identification 身份识别(账号、UID等)
 */
- (NSString*)oauthKeyOfTBLogonPropertyWithIdentification:(NSString*)identification;

/**删除一个登录信息
 * @param identification 身份识别(账号、UID等)
 */
- (void)deleteTBLogonPropertyWithIdentification:(NSString*)identification;

/**查询获取多个登录信息
 * @param ascending 按更新时间升序排序, YES=升序, NO=降序
 * @return NSString实例数组
 */
- (NSArray*)identificationsOfTBLogonPropertyAscending:(BOOL)ascending;

#pragma mark - message
/**查询获取符合条件的聊天记录数量
 * (EBMessage结构封装)
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 */
- (NSUInteger)countOfMessagesWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime;

/**查询获取符合条件的聊天记录数量
 * (EBMessage结构封装)
 * @param talkId 对话归类编号
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 */
- (NSUInteger)countOfMessagesWithTBTalkId:(NSString*)talkId andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime;

/**查询获取聊天记录
 * (EBMessage结构封装)
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 * @param perPageSize 每页数量
 * @param currentPage 当前页(从1开始算)
 * @param orderByTimeAscending 按聊天记录发生时间升序进行排序
 * @return EBMessage实例数组
 */
- (NSArray*)messagesWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime perPageSize:(NSUInteger)perPageSize currentPage:(NSUInteger)currentPage orderByTimeAscending:(BOOL)orderByTimeAscending;

/**查询获取聊天记录
 * (EBMessage结构封装)
 * @param talkId 对话归类编号
 * @param beginTime 聊天记录发生时间范围下限
 * @param endTime 聊天记录发生时间范围上限
 * @param perPageSize 每页数量
 * @param currentPage 当前页(从1开始算)
 * @param orderByTimeAscending 按聊天记录发生时间升序进行排序
 * @return EBMessage实例数组
 */
- (NSArray*)messagesWithTBTalkId:(NSString*)talkId andBeginTime:(NSDate*)beginTime endTime:(NSDate*)endTime perPageSize:(NSUInteger)perPageSize currentPage:(NSUInteger)currentPage orderByTimeAscending:(BOOL)orderByTimeAscending;

/**查询获取符合条件的聊天记录
 * (EBMessage内部结构)
 * @param messageId 消息编号，用于定位记录位置
 * @param orderByTimeAscending 是否按聊天记录发生时间升序进行排序；NO=降序排序(回头查询)，YES=升序排序
 * @param perPageSize 结果集最大返回数量
 * @return EBMessage实例数组
 */
- (NSArray*)messagesFromLastMessageId:(uint64_t)messageId orderByTimeAscending:(BOOL)orderByTimeAscending perPageSize:(NSUInteger)perPageSize;

/**查询获取多个聊天记录
 * @param messageIds 消息编号数组, NSNumber实例
 * @return EBMessage实例数组
 */
- (NSArray*)messagesWithMessageIds:(NSArray*)messageIds;

/**查询获取单条聊天记录
 * (EBMessage结构封装)
 * @param messageId 消息编号
 * @return EBMessage实例数组
 */
- (EBMessage*)messageWithMessageId:(uint64_t)messageId;

/**删除单条聊天记录
 * @param messageId 消息编号
 */
- (void)deleteMessageWithMessageId:(uint64_t)messageId;

/**删除多条聊天记录
 * @param messageIds 消息编号数组
 */
- (void)deleteMessagesWithMessageIds:(NSArray*)messageIds;

/**删除多条聊天记录
 * @param messageIds 对话归类编号
 */
- (void)deleteMessagesWithTBTalkId:(NSString*)talkId;

#pragma mark - Talk
/**获取所有对话归类
 * @return EBTalk数组
 */
- (NSArray*)talks;

/**查询获取对话归类
 * @param talkId 对话归类编号
 * @return EBTalk实例
 */
- (EBTalk*)talkWithTalkId:(NSString*)talkId;

/**查询获取对话归类，depCode、otherUid和otherAccount不可同时等于0或nil
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param otherAccount 对方用户账号(用于一对一会话)
 * @return EBTalk实例
 */
- (EBTalk*)talkWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid otherAccount:(NSString*)otherAccount;

/**删除对话归类
 * @param talkId 对话归类编号
 */
- (void)deleteTalkWithTalkId:(NSString*)talkId;

/**更新对话归类时间字段
 * @param updatedTime 时间
 * @param talkId 对话归类编号
 */
- (void)updateTalkWithUpdatedTime:(NSDate*)updatedTime forTalkId:(NSString*)talkId;

/**新增或更新对话归类，depCode、otherUid和otherAccount不可同时等于0或nil
 * @param depCode 部门或群组编号(用于用户群组会话, 大于0表示群组会话)
 * @param otherUid 对方用户编号(用于一对一会话)
 * @param otherAccount 对方用户账号(用于一对一会话)
 * @param otherUserName 对话用户名(用于一对一会话)
 * @param successBlock 成功时调用的block
 * @param failureBlock 失败时调用的block
 */
- (void)insertOrUpdateTalkWithDepCode:(uint64_t)depCode otherUid:(uint64_t)otherUid otherAccount:(NSString*)otherAccount otherUserName:(NSString*)otherUserName success:(void(^)(EBTalk* talk))successBlock failure:(void(^)(NSError* error))failureBlock;

@end


#pragma mark - PersistenceExt2
///数据本地保存功能2
@interface ENTBoostClient (PersistenceExt2)
#pragma mark - TBCacheVersion
/**查询获取一个缓存版本对象
 * @param code 编号
 * @param type 版本类型
 * @return TBCacheVersion实例
 */
- (TBCacheVersion*)tbCacheVersionWithCode:(uint64_t)code type:(EB_CACHE_VERSION_INFO_TYPE)type;

/*新增或更新缓存版本对象
 * @param code 编号
 * @param type 版本类型
 * @param version 版本
 * @param description 描述
 * @return 新增或已存在的TBCacheVersion实例
 */
- (TBCacheVersion*)saveOrUpdateTBCacheVersion:(uint64_t)code type:(EB_CACHE_VERSION_INFO_TYPE)type version:(uint64_t)version description:(NSString*)description;

/**删除一个缓存版本对象
 * @param code 编号
 * @param type 版本类型
 */
- (void)deleteTBCacheVersionWithCode:(uint64_t)code type:(EB_CACHE_VERSION_INFO_TYPE)type;

/**更新缓存加载状态
 * @param loaded 加载状态
 * @param code 编号
 * @param type 本地缓存资料版本类型
 */
- (void)updateLoadedState:(BOOL)loaded forTBCacheVersionUsingCode:(uint64_t)code andType:(EB_CACHE_VERSION_INFO_TYPE)type;

#pragma mark - TBGroupInfo
/**在本地缓存查询获取多个部门或群组对象
 * @param isEntGroup YES=获取部门信息，NO=获取群组信息
 * @return TBGroupInfo实例的数字
 */
- (NSArray*)tbGroupInfos:(BOOL)isEntGroup;

/**在本地缓存查询获取一个部门或群组对象
 * @param depCode 部门或群组编号
 * @return TBGroupInfo实例
 */
- (TBGroupInfo*)tbGroupInfoWithDepCode:(uint64_t)depCode;

/**在本地缓存删除一个部门或群组对象
 * @param depCode 部门或群组编号
 */
- (void)deleteTBGroupInfoWithDepCode:(uint64_t)depCode;

/**在本地缓存新增或更新一个部门或群组对象
 * @param ebGroupInfo 部门或群组对象
 * @return TBGroupInfo实例
 */
- (TBGroupInfo*)saveOrUpdateTBGroupInfoUsingEBGroupInfo:(EBGroupInfo*)ebGroupInfo;

/**在本地缓存新增或更新多个部门或群组对象
 * @param ebGroupInfos 包含部门或群组实例的数组
 */
- (void)saveOrUpdateTBGroupInfosUsingEBGroupInfos:(NSDictionary*)ebGroupInfos;

/**在本地缓存更新部门或群组加载状态
 * @param loaded 加载状态
 * @param depCode 部门或群组编号
 */
- (void)updateLoadedState:(BOOL)loaded forTBGroupInfoUsingDepCode:(uint64_t)depCode;

#pragma mark - TBMemberInfo
/**在本地缓存查询获取一个成员信息
 * 参数empCode和uid要求至少一个不等于0
 * @param empCode 成员编号, 0=忽略条件
 * @param uid 用户编号, 0=忽略条件
 * @return TBMemberInfo实例数组
 */
- (TBMemberInfo*)tbMemberInfoWithEmpCode:(uint64_t)empCode orUid:(uint64_t)uid;

/**在本地缓存查询获取多个成员信息
 * @param depCode 部门或群组编号
 * @return TBMemberInfo实例数组
 */
- (NSArray*)tbMemberInfosWithDepCode:(uint64_t)depCode;

/**在本地缓存删除一个成员信息
 * 参数empCode和uid要求至少一个不等于0
 * @param empCode 成员编号, 0=忽略条件
 * @param uid 用户编号, 0=忽略条件
 */
- (void)deleteTBMemberInfoWithEmpCode:(uint64_t)empCode orUid:(uint64_t)uid;

/**在本地化缓存删除多个成员信息
 * @param depCode 部门或群组编号
 */
- (void)deleteTBMemberInfoWithDepCode:(uint64_t)depCode;

/**在本地缓存新增或更新成员信息对象
 * @param ebMemberInfo 成员信息
 * @return TBMemberInfo实例
 */
- (TBMemberInfo*)saveOrUpdateTBMemberInfoUsingEBMemberInfo:(EBMemberInfo*)ebMemberInfo;

/**在本地缓存新增或更新多个成员信息对象
 * @param ebMemberInfo 成员信息
 */
- (void)saveOrUpdateTBMemberInfosUsingEBMemberInfos:(NSArray*)ebMemberInfos;

@end

